Đôi khi bạn cần phải tải xuống một hình ảnh từ một URL cụ thể nào đó và sử dụng nó vào dự án của mình. Một cách đơn giản và dễ dàng đó là đi đến trang cần tải ảnh và sử dụng nút chuột phải và lưu hình ảnh. Nhưng nếu bạn muốn làm điều đó theo chương trình thì sao? Mỗi người đều có lý do riêng để sử dụng chúng, ví dụ như mình cần viết một chức năng chạy lấy bài viết từ một website nào đó và trong đó có nội dung hình ảnh, mình không muốn lưu lại nội dung với url ảnh là của họ mà muốn tải về trên server của mình, còn bạn có thể khác :D. Như ví dụ của mình thì một bài viết có thể có rất nhiều hình ảnh, nếu lưu thủ công từng cái một thì quá lâu, vì vậy giải pháp nhanh và tiện lợi đó là khi lấy nội dung thì lưu ảnh về server luôn.
Vậy làm sao để lấy hình từ website khác bằng PHP?
Có 2 cách để bạn có thể lấy ảnh từ website khác:
- Sử dụng cách xử lý tập tin cơ bản.
- Sử dụng một thư viện HTTP gọi là cURL.
Cả 2 cách để lưu ảnh trong php này đều có ưu điểm và nhược điểm riêng, giờ chúng ta đi vào từng cách dùng cụ thể nhé.
Sử dụng cách Xử lý tệp cơ bản
Đây là cách cơ bản và dễ nhất để hoàn thành nhiệm vụ. Cũng giống như bất kỳ tập tin nào khác, hãy bắt đầu với việc tạo một tập tin trống và mở nó trong chế độ ghi (write). Sau đó, tìm lấy nội dung từ URL nguồn và dán nó vào tệp này. Chỉ đơn giản vậy thôi.
Từ kịch bản trên ta có các bước cụ thể như sau:
- Khai báo hai biến có tên là
$url
và$img
, tương ứng với URL nguồn và tệp đích. - Sử dụng hàm
file_put_contents()
để viết một chuỗi vào một tệp có hai đối số. Một là tên tệp (hoặc đường dẫn) và hai là nội dung của tệp đó. - Sử dụng hàm
file_get_contents()
để đọc tệp thành một chuỗi.
Ví dụ
<?php
$url ='https://vzn.vn/wp-content/uploads/2019/04/hinhnendangnhap-2.png';
$imgpath = '/path/to/save/images/new_name.png';
// Function to write image into file
file_put_contents($imgpath, file_get_contents($url));
echo "Lưu ảnh thành công!"
?>
Ghi chú: Code trên lưu hình ảnh vào máy chủ với tên new_name.png đã đặt ở trên.
Nhược điểm: Bây giờ vấn đề duy nhất với phương thức này là nó yêu cầu cấu hình allow_url_fopen được bật và được đặt thành 1 theo mặc định. Nhưng đôi khi, các yêu cầu của dự án không cho phép có tùy chọn này. Điều này có thể là do một số biện pháp phòng ngừa an ninh hoặc chỉ là một nguyên tắc thiết kế. Trong những trường hợp như vậy chúng ta có một phương pháp khác để lưu hình ảnh.
Sử dụng thư viện HTTP, cURL
Nói đúng ra, cURL không chỉ là thư viện HTTP. Nó cũng có một số giao thức truyền dữ liệu khác. Vì hình ảnh của chúng ta nằm trên máy chủ HTTP, chúng ta sẽ giới hạn bản nghiên cứu một phần nhỏ của thư viện này.
cURL cho phép thực hiện các yêu cầu HTTP trong PHP. Bắt đầu bằng cách khởi tạo một thể hiện của nó và thiết lập một số tùy chọn cần thiết cho yêu cầu, bao gồm cả URL. Sau đó thực hiện truy vấn này trả về nội dung của tệp. Sau đó, phần còn lại của thủ tục là như nhau. Ngay sau khi chúng ta nhận được dữ liệu, hãy đặt nó vào một tệp và lưu nó. (Giống cách bên trên).
Các bước cụ thể
- Trong tập lệnh này, chúng ta sẽ viết một hàm file_get_contents_curl để sao chép hành vi của file_get_contents từ kỹ thuật được đề cập trước đó.
- Bên trong hàm này, chúng ta sẽ khởi tạo một thể hiện của cURL bằng cách sử dụng hàm curl_init để sử dụng nó trong việc tìm nạp dữ liệu.
- Sau đó, một số tùy chọn cần được đặt bằng curl_setopt để ví dụ cụ thể này có thể hoạt động. Hàm này có ba đối số
- Một ví dụ của cURL
- Tùy chọn tương ứng cần được đặt
- Và giá trị mà tùy chọn được đặt
- Trong ví dụ này, các tùy chọn sau được đặt:
- CURLOPT_HEADER, nghĩa là đảm bảo bạn có cần nhận các tiêu đề hay không;
- CURLOPT_RETURNTRANSFER chuyển dữ liệu dưới dạng giá trị trả về của hàm curl_exec thay vì xuất trực tiếp.
- Đây là một tùy chọn khác CURLOPT_URL đặt URL cho yêu cầu.
- Sau đó, chúng tôi lấy dữ liệu từ curl_exec và trả về từ hàm cha.
- Dữ liệu này sau đó được ghi vào tệp trên máy của bạn bằng file_put_contents .
Ví dụ
<?php
function file_get_contents_curl($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
$data = file_get_contents_curl('https://vzn.vn/wp-content/uploads/2019/04/hinhnendangnhap-2.png');
$fp = '/path/to/save/images/new_name.png';
// Function to write image into file
file_put_contents( $fp, $data );
echo "Lưu ảnh thành công!"
?>
Phương pháp này cung cấp một chút linh hoạt trong khi tìm nạp nội dung từ internet. Như đã đề cập trước đó, nó không chỉ giới hạn ở HTTP mà còn có thể được sử dụng trong nhiều trường hợp khác. Nó cho phép cấu hình chuyển đổi theo bất cứ cách nào bạn muốn. Ví dụ: file_get_contents chỉ sử dụng một yêu cầu GET đơn giản để tìm nạp dữ liệu, nhưng với cURL, có thể sử dụng GET, POST, PUT và các phương thức khác.
Trên đây là cách lưu hình ảnh từ website khách bằng cách sử dụng PHP. Hy vọng bài viết giúp ích cho bạn.